<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>模板数据库</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="manage-ag-createdb.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="managing-databases.html">快退</a></td><td width="60%" align="center" valign="bottom">章19. 管理数据库</td><td width="10%" align="right" valign="top"><a href="managing-databases.html">快进</a></td><td width="10%" align="right" valign="top"><a href="manage-ag-config.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="MANAGE-AG-TEMPLATEDBS">19.3. 模板数据库</a></h1>
<p><tt class="COMMAND">CREATE DATABASE</tt> 实际上是通过拷贝一个现有的数据库进行工作的。缺省时，它拷贝名为 <tt class="LITERAL">template1</tt> 的标准系统数据库。所以该数据库是创建新数据库的"模板"。如果你给 <tt class="LITERAL">template1</tt> 增加对象，这些对象将被拷贝到随后创建的用户数据库中。这样的行为允许节点对数据库中的标准套件进行修改。比如，如果你把过程语言 PL/pgSQL 安装到 <tt class="LITERAL">template1</tt> 里，那么你在创建用户数据库的时候它们就会自动可得，而不需要额外的动作。</p>
<p>系统里还有名为 <tt class="LITERAL">template0</tt> 的第二个标准系统数据库，这个数据库包含和 <tt class="LITERAL">template1</tt> 初始时一样的数据内容，也就是说，只包含标准的 PostgreSQL 对象。在 <tt class="COMMAND">initdb</tt> 之后，我们不应该对 <tt class="LITERAL">template0</tt> 做任何修改。通过告诉 <tt class="COMMAND">CREATE DATABASE</tt> 使用 <tt class="LITERAL">template0</tt> 而不是 <tt class="LITERAL">template1</tt> 进行拷贝，你可以创建一个"纯净"的用户数据库，它不会包含任何 <tt class="LITERAL">template1</tt> 里所特有的东西。这一点在恢复 <tt class="LITERAL">pg_dump</tt> 转储的时候是非常方便的：转储脚本应该在一个纯净的数据库中恢复以确保我们正确创建了被转储出的数据库内容，而不和任何现在可能已经存在于 <tt class="LITERAL">template1</tt> 中的附加物相冲突。</p>
<p>要通过拷贝 <tt class="LITERAL">template0</tt> 的方法创建一个数据库，可使用下列方法之一：</p>
<pre class="PROGRAMLISTING">CREATE DATABASE <tt class="REPLACEABLE"><i>dbname</i></tt> TEMPLATE template0;</pre>
<pre class="PROGRAMLISTING">createdb -T template0 <tt class="REPLACEABLE"><i>dbname</i></tt></pre>
<p>前者用于 SQL 环境，后者用于 shell 环境。</p>
<p>我们可以创建额外的模板数据库，而且实际上我们可以在一个集群中通过将 <tt class="COMMAND">CREATE DATABASE</tt> 的模板声明为相应的数据库名拷贝任何数据库。不过，我们必需明白，这个功能并非一般性的<span class="QUOTE">"<tt class="COMMAND">COPY DATABASE</tt>"</span>工具。实际上，在拷贝操作的过程中，源数据库必需是空闲状态(没有正在处理的数据修改事务)。如果在 <tt class="COMMAND">CREATE DATABASE</tt> 开始的时候存在其它连接，那么操作将会失败，否则在 <tt class="COMMAND">CREATE DATABASE</tt> 的执行过程中新连接都将被锁定，直到拷贝完成。</p>
<p>在 <tt class="LITERAL">pg_database</tt> 里有两个有用的标志可以用于每个数据库：<tt class="LITERAL">datistemplate</tt> 和 <tt class="LITERAL">datallowconn</tt> 字段。<tt class="LITERAL">datistemplate</tt> 表示该数据库是准备用作 <tt class="COMMAND">CREATE DATABASE</tt> 模板的。如果设置了这个标志，那么该数据库可以由任何有 <tt class="LITERAL">CREATEDB</tt> 权限的用户克隆；如果没有设置，那么只有超级用户和该数据库的所有者可以克隆它。如果 <tt class="LITERAL">datallowconn</tt> 为假，那么将不允许与该数据库发生任何新的连接(不过现有的会话不会因为把该标志设置为假而被杀死)。<tt class="LITERAL">template0</tt> 数据库通常被标记为 <tt class="LITERAL">datallowconn = false</tt> 以避免对它的修改。<tt class="LITERAL">template0</tt> 和 <tt class="LITERAL">template1</tt> 都应该总是标记为 <tt class="LITERAL">datistemplate = true</tt> 。</p>
<div class="NOTE">
<blockquote class="NOTE">
<p><b>【注意】</b><tt class="LITERAL">template1</tt> 和 <tt class="LITERAL">template0</tt> 没有任何特殊的状态，除了 <tt class="LITERAL">template1</tt> 是 <tt class="COMMAND">CREATE DATABASE</tt> 的缺省源数据库名之外。比如，我们可以删除 <tt class="LITERAL">template1</tt> 然后从 <tt class="LITERAL">template0</tt> 中创建它而不会有任何不良效果。如果我们不小心在 <tt class="LITERAL">template1</tt> 里加了一堆垃圾，那么我们就会建议做这样的操作。</p>
<p>在初始化数据库集群的时候，也会创建 <tt class="LITERAL">postgres</tt> 数据库。这个数据库用于做为用户和应用连接的缺省数据库。它只是 <tt class="LITERAL">template1</tt> 的一个简单拷贝，需要的时候可以删除或者重建。</p>
</blockquote>
</div>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="manage-ag-createdb.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="manage-ag-config.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">创建一个数据库</td><td width="34%" align="center" valign="top"><a href="managing-databases.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">数据库配置</td></tr>
</table>
</div>
</body></html>